3장. 확률로 찍기
출처: 『AI 엔지니어링 선수지식』(youtubedu 자체 제작 학습노트) | 입문판 재구성 — 노트가 1차 소스(PDF 원본 없음)
코드는 분위기만 — numpy 나 np.log 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.
이 장은 세 갈래 중 마지막 갈래입니다.
숫자로 바꾸고(선형대수), 고칠 방향을 찾고(미적분), 그리고 이제 확률로 찍습니다.
AI 는 다음에 올 단어를 딱 하나 아는 게 아닙니다.
"이게 80% 쯤 될 것 같은데" 하고 찍습니다.
그래서 확률은 AI 의 모국어입니다.
0. 이 장의 새 단어
0장 용어집에 이미 나온 말(확률분포·조건부확률·엔트로피·크로스 엔트로피·손실)은 0장으로 돌아가 확인하세요.
여기서는 0장에 없는 새 단어 3개만 풀어 둡니다.
이 셋만 더 알면 이 장은 끝까지 읽힙니다.
기댓값(expected value)
한 문장 뜻 — 같은 일을 아주 여러 번 했을 때 평균적으로 나오는 값.
일상비유 — 반 평균 점수. 한 명 한 명은 들쭉날쭉해도, 전체를 평균 내면 "대충 이쯤" 이라는 한 숫자가 나온다.
한 줄 예 —
# 주사위 한 면당 1/6, 평균적으로 나오는 눈 = 3.5
expected = (1+2+3+4+5+6) / 6 # 3.5
분산(variance)
한 문장 뜻 — 값들이 평균에서 얼마나 멀리 흩어져 있는가의 크기.
일상비유 — 화살 자국이 과녁에 모였나 흩어졌나. 한가운데 옹기종기면 분산이 작고, 사방에 퍼지면 분산이 크다.
한 줄 예 —
# 다들 70 근처면 분산 작음 / 0~100 으로 널뛰면 분산 큼
tight = [69, 70, 71] # 분산 작음
wide = [10, 70, 100] # 분산 큼
최대우도추정(maximum likelihood estimation, MLE)
한 문장 뜻 — 가진 데이터를 가장 그럴듯하게 설명하는 값(설정)을 골라잡는 방법.
일상비유 — 발자국 보고 범인 추리. 진흙 발자국이 크면 "발 큰 사람일 가능성이 제일 높다" 고 가장 그럴듯한 답을 고르는 일.
한 줄 예 —
# 동전 10번에 앞면 7번 → "이 동전 앞면 확률은 0.7" 이 가장 그럴듯
p_estimate = 7 / 10 # 0.7
(귀납 도입) 이런 적 있죠?
빈칸 채우기 문제를 풀어 봅니다.
"나는 학교에 ___"
여러분 머릿속에 "간다" 가 떠오릅니다.
그런데 "갔다" 도 말이 되고, "도착했다" 도 됩니다.
"피자" 는 거의 안 됩니다.
여러분은 사실 답 하나만 안 게 아닙니다.
머릿속에서 후보마다 점수를 매긴 겁니다.
"간다 80점, 갔다 15점, 피자 0.01점" 처럼요.
그게 바로 확률분포입니다.
AI 도 똑같이 합니다.
후보마다 확률을 매겨 놓고, 그중 하나를 골라 내놓습니다.
한 문장 정의 — AI 는 다음에 올 후보들에 확률을 매겨(확률분포) 하나를 고르는 확률 기계다.
이 장에서 딱 4가지만
- 확률분포 — 후보마다 확률을 펼쳐 놓은 지도. 다 더하면 항상 1.
- 조건부확률·베이즈 — "앞을 알 때 다음 확률". 새 증거가 오면 믿음을 고쳐 잡는다.
- 기댓값·분산 — 평균적으로 얼마(기댓값), 얼마나 들쭉날쭉(분산).
- 크로스 엔트로피 — 정답을 낮게 찍을수록 커지는 벌점. 이게 AI 학습의 점수표다.
한 문장으로, AI 는 조건부확률로 다음 단어 분포를 내놓고, 크로스 엔트로피 벌점을 줄이며 배우는 기계입니다.
개념 1 — 확률분포
막히는 장면
일기예보 앱을 켭니다.
"내일 비 70%, 맑음 30%."
여기서 누가 "비 70%, 맑음 80%" 라고 적어 놨다면 이상하죠.
합이 150% 라니, 말이 안 됩니다.
확률은 다 더하면 딱 100%(=1) 여야 합니다.
이 "합이 1" 규칙이 분포의 핵심입니다.
일상비유 — 주사위와 일기예보
주사위는 1부터 6까지 각각 1/6 입니다.
여섯 개를 다 더하면 6/6 = 1 입니다.
일기예보도 마찬가지로 모든 경우를 더하면 1 입니다.
분포란 "가능한 모든 경우에 확률을 펼쳐 놓은 지도" 이고, 지도 전체 넓이는 항상 1 입니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 일기예보 확률표 | probs = [0.25, 0.5, 0.25] |
다 더해 1 이 아니면 분포가 깨짐 |
| 주사위 1~6 각 1/6 | probs.sum() # 1.0 |
음수 확률은 있을 수 없음 |
한 문장 정의 — 확률분포는 가능한 경우마다 확률을 매긴 지도이며, 모든 확률의 합은 항상 1이다.
예시 폭격
예시 1 (완성예) — 동전을 2번 던질 때 앞면 수를 셉니다.
앞면 0번: 1/4, 앞면 1번: 2/4, 앞면 2번: 1/4.
다 더하면 1/4 + 2/4 + 1/4 = 4/4 = 1.
# 가능한 경우의 확률을 다 더하면 1
probs = [0.25, 0.5, 0.25]
print(sum(probs)) # 1.0
예시 2 (부분완성, 빈칸) — 가위바위보를 무작위로 낸다면 가위·바위·보가 각각 몇 분의 몇일까요?
각 1/3 입니다.
세 개를 더하면 1/3 + 1/3 + ___ = 1.
빈칸은 1/3 입니다. (합은 언제나 1)
예시 3 (독립적용) — 누가 "이 게임 아이템은 70% 확률로 칼, 50% 확률로 방패가 나온다" 고 말합니다.
뭐가 이상할까요?
70 + 50 = 120% 라서 분포가 깨졌습니다.
확률의 합은 100% 를 넘을 수 없습니다.
잘못된 예 vs 올바른 예
# 잘못: 합이 1.2 → 분포가 아님
bad = [0.7, 0.5]
# 올바름: 합이 1.0
good = [0.7, 0.3]
실무 한 조각 — AI 의 출력은 수만 개 단어 전체에 대한 확률분포입니다.
"temperature" 라는 설정이 이 분포를 뾰족하게(확실하게) 또는 완만하게(다양하게) 조절합니다.
미니 시나리오 — AI 가 같은 질문에 매번 조금씩 다른 답을 합니다.
왜냐고요?
매번 같은 분포에서 "뽑기" 를 하기 때문입니다.
뽑을 때마다 결과가 살짝 달라집니다.
개념 2 — 조건부확률·베이즈
막히는 장면
병원에 갑니다.
의사가 처음엔 "그냥 감기일 확률 20% 쯤" 으로 봅니다.
그런데 "기침이 심하다" 는 말을 듣자마자 감기 확률을 60% 로 올립니다.
새 정보(기침) 하나로 믿음이 바뀐 겁니다.
이렇게 "무언가를 알게 됐을 때의 확률" 이 조건부확률입니다.
새 증거로 믿음을 고쳐 잡는 방법이 베이즈입니다.
일상비유 — 스팸 필터
이메일에 "무료" 라는 단어가 보입니다.
스팸일 확률이 확 올라가죠.
거기에 "당첨" 까지 보이면 더 올라갑니다.
단어가 쌓일수록 "스팸이다" 라는 믿음을 한 단계씩 갱신합니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 기침 보고 감기 확률 ↑ | P("감기" given "기침") |
증거를 무시하면 옛 믿음에 갇힘 |
| 단어 쌓일수록 갱신 | 사후 = 우도 * 사전 / 증거 |
사전 믿음이 틀리면 결론도 휘어짐 |
한 문장 정의 — 조건부확률은 "B를 알 때 A의 확률" 이고, 베이즈는 새 증거로 그 확률을 고쳐 잡는 사이클이다.
예시 폭격
예시 1 (완성예) — "무료" 가 있으면 스팸 확률이 0.4 에서 0.64 로 오릅니다.
공식은 사후 = 우도 × 사전 ÷ 증거 입니다.
# P(스팸|"무료") = P("무료"|스팸) * P(스팸) / P("무료")
post = 0.8 * 0.4 / 0.5
print(round(post, 2)) # 0.64
예시 2 (부분완성, 빈칸) — 사전 믿음이 0.4 였는데 증거를 본 뒤 0.64 가 됐습니다.
믿음이 올랐나요, 내렸나요?
0.4 → 0.64 이니 ___ 습니다. (올랐)
증거가 "스팸 쪽" 을 가리켰기 때문입니다.
예시 3 (독립적용) — 길에서 우산 든 사람을 여럿 봅니다.
"비 올 확률" 에 대한 믿음을 어떻게 고쳐야 할까요?
우산(증거)을 봤으니 비 확률을 올려 잡습니다.
이게 베이즈식 갱신입니다.
잘못된 예 vs 올바른 예
# 잘못: 증거를 보고도 옛 믿음 그대로
belief = 0.2 # 기침을 들었는데 안 바꿈
# 올바름: 증거로 믿음을 갱신
belief = 0.6 # 기침 듣고 올려 잡음
AI 연결 — 언어모델은 "앞 단어들을 봤을 때 다음 단어 확률", 즉 P(다음 given 이전들) 을 배운 것입니다.
이게 GPT 의 정의 그 자체입니다.
조건부확률을 빼면 언어모델은 없습니다.
미니 시나리오 — AI 에게 "나는 카페에 가서" 까지 줍니다.
AI 는 그 앞부분을 조건으로 깔고, "커피" 의 확률을 높게 잡습니다.
조건이 "도서관에 가서" 였다면 "책" 의 확률이 높아졌겠죠.
개념 3 — 기댓값·분산
막히는 장면
두 반의 시험 결과를 비교합니다.
A반도 평균 70점, B반도 평균 70점.
"그럼 똑같네?" 싶지만 아닙니다.
A반은 다들 68~72점에 몰려 있고, B반은 30점과 100점이 섞여 있습니다.
평균(기댓값)은 같아도 흩어짐(분산)이 전혀 다릅니다.
이 둘을 같이 봐야 진짜 모습이 보입니다.
일상비유 — 양궁 과녁
화살 자국의 "중심" 이 기댓값입니다.
화살 자국이 "얼마나 퍼졌나" 가 분산입니다.
한가운데 옹기종기 모이면 분산이 작고, 사방에 흩어지면 분산이 큽니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 화살 자국의 중심 | vals.mean() # 평균 |
평균만 보면 흩어짐을 놓침 |
| 화살 자국의 퍼짐 | vals.var() # 분산 |
분산이 크면 결과가 불안정 |
한 문장 정의 — 기댓값은 평균적으로 기대되는 값이고, 분산은 값들이 평균에서 얼마나 흩어졌는가의 크기다.
예시 폭격
예시 1 (완성예) — 주사위의 기댓값을 구합니다.
(1+2+3+4+5+6) ÷ 6 = 21 ÷ 6 = 3.5.
vals = [1, 2, 3, 4, 5, 6]
print(sum(vals) / len(vals)) # 3.5
예시 2 (부분완성, 빈칸) — [10, 70, 100] 과 [69, 70, 71] 은 둘 다 평균이 비슷합니다.
분산이 더 큰 쪽은 ___ 입니다. ([10, 70, 100])
값들이 평균에서 멀리 흩어져 있기 때문입니다.
예시 3 (독립적용) — 배달 앱이 "평균 30분" 이라고 합니다.
그런데 어떤 날은 10분, 어떤 날은 60분입니다.
평균은 30분이 맞지만 분산이 커서 못 믿겠죠.
"평균만 보면 안 된다" 가 분산의 교훈입니다.
잘못된 예 vs 올바른 예
# 잘못: 평균만 보고 두 반이 같다고 판단
same = (a_mean == b_mean)
# 올바름: 평균과 분산을 함께 봄
real = (a_mean == b_mean) and (a_var == b_var)
AI 연결 — AI 성능을 평가할 때, 그리고 학습이 안정적인지 진단할 때 평균과 분산을 봅니다.
흩어짐이 너무 크면 학습이 출렁여서 불안정하다는 신호입니다.
미니 시나리오 — 같은 AI 를 두 번 학습시켰는데 점수가 90점, 50점으로 갈립니다.
분산이 큰 겁니다.
"운에 휘둘리는 학습" 이라 손봐야 한다는 뜻입니다.
개념 4 — 최대우도추정·엔트로피·크로스 엔트로피
막히는 장면
동전을 10번 던졌더니 앞면이 7번 나왔습니다.
"이 동전, 앞면 확률이 얼마일까?"
5:5 일 수도 있지만, 데이터를 보면 0.7 이 가장 그럴듯합니다.
데이터를 가장 잘 설명하는 값을 고르는 일이 최대우도추정(MLE)입니다.
그리고 AI 학습은 결국 "내 예측이 정답과 얼마나 다른가" 를 점수로 매겨 줄이는 일입니다.
그 점수가 크로스 엔트로피입니다.
일상비유 — 엔트로피는 헷갈림
공정한 동전(앞뒤 5:5)은 결과를 도무지 못 맞힙니다.
최대로 헷갈리죠. 엔트로피가 큽니다.
"항상 앞면" 인 가짜 동전은 안 봐도 압니다.
전혀 안 헷갈립니다. 엔트로피가 0 입니다.
일상비유 — 크로스 엔트로피는 오답 벌점
정답이 "고양이" 인데 AI 가 "고양이 10%, 개 90%" 라 했다면 큰 벌점입니다.
"고양이 95%" 라 했다면 작은 벌점입니다.
정답을 낮게 찍을수록 벌점이 커집니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 발자국 보고 범인 추리(MLE) | p = 7 / 10 # 0.7 |
데이터가 적으면 추정이 흔들림 |
| 헷갈림의 크기(엔트로피) | entropy(공정동전) 큼 |
헷갈림 0 이 항상 좋은 건 아님 |
| 오답 벌점(크로스 엔트로피) | penalty = -log(0.1) |
정답에 낮은 확률 주면 손실 폭발 |
한 문장 정의 — MLE 는 데이터를 가장 그럴듯하게 설명하는 값을 고르고, 엔트로피는 헷갈림의 크기이며, 크로스 엔트로피는 정답을 낮게 찍을수록 커지는 벌점이다.
예시 폭격
예시 1 (완성예) — 벌점은 −log(정답에 준 확률) 입니다.
정답을 0.1 로 찍으면 −log(0.1) ≈ 2.30 (큰 벌점).
정답을 0.9 로 찍으면 −log(0.9) ≈ 0.10 (작은 벌점).
import numpy as np
print(round(-np.log(0.1), 2)) # 2.3 (정답을 10%만 줘서 큰 벌점)
print(round(-np.log(0.9), 2)) # 0.1 (정답을 90% 줘서 작은 벌점)
예시 2 (부분완성, 빈칸) — 동전을 10번 던져 앞면이 3번 나왔습니다.
MLE 로 본 앞면 확률은 ___ 입니다. (3/10 = 0.3)
데이터(3번)를 가장 그럴듯하게 설명하는 값이기 때문입니다.
예시 3 (독립적용) — AI 가 정답에 0.5 의 확률을 줬습니다.
벌점은 −log(0.5) ≈ 0.69 입니다.
0.1 일 때(2.30)보다 작고, 0.9 일 때(0.10)보다 큽니다.
"정답에 준 확률이 높을수록 벌점이 준다" 가 한눈에 보입니다.
잘못된 예 vs 올바른 예
# 잘못: 정답에 낮은 확률 → 큰 벌점
penalty = -np.log(0.1) # 2.30
# 올바름: 정답에 높은 확률 → 작은 벌점
penalty = -np.log(0.95) # 0.05
AI 연결 — AI 학습의 점수표가 바로 크로스 엔트로피입니다.
AI 는 매 단계마다 이 벌점을 조금씩 줄이는 방향으로 가중치를 고칩니다(0장 척추 5 의 경사하강).
벌점이 줄어들수록 정답을 더 높은 확률로 찍게 됩니다.
미니 시나리오 — AI 가 "다음 단어는 '간다'" 인데 0.2 만 줬습니다.
벌점이 −log(0.2) ≈ 1.61 로 꽤 큽니다.
학습이 진행되면 같은 자리에서 '간다' 에 0.8 을 주게 되고, 벌점은 0.22 로 줄어듭니다.
이게 "배운다" 의 실제 모습입니다.
단순 규칙
복잡할 땐 이 네 줄만 기억하세요.
-
분포는 다 더하면 1 — 합이 안 맞으면 어딘가 틀린 것.
-
조건이 붙으면 확률이 달라진다 — 새 증거가 오면 믿음을 고쳐라.
-
평균만 보지 말고 흩어짐(분산)도 같이 봐라.
-
정답을 높게 찍으면 벌점이 작다 — AI 는 이 벌점을 줄이며 배운다.
한 걸음 더 ▸ (지금 몰라도 됨)
"엔트로피가 0 이면 무조건 좋다" 가 아닙니다.
너무 확신만 하는 AI 는 새로운 입력에 약합니다.
적당한 불확실성이 오히려 건강할 때가 있습니다.
지금은 "정답을 높게 찍자" 단순 규칙만 들고 가면 충분합니다.
정리
AI 는 다음 단어 후보에 확률을 매겨(확률분포) 하나를 뽑는 기계입니다.
그 확률은 "앞 단어들을 봤을 때" 라는 조건이 붙은 조건부확률입니다.
정답을 낮게 찍을수록 커지는 벌점(크로스 엔트로피)을 줄이며 배웁니다.
| 개념 | AI 에서의 역할 |
|---|---|
| 확률분포 | 다음 단어 후보 확률 (출력) |
| 조건부확률 | "앞 단어들 → 다음 단어" = GPT 의 정의 |
| 기댓값·분산 | 성능 평가·학습 안정성 진단 |
| 크로스 엔트로피 | 학습의 벌점(점수표) |
다음 장 예고 1줄 — 다음 장에서는 이 모든 계산이 실제로 컴퓨터 위에서 어떻게 굴러가는지를 봅니다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)
클릭하거나 Space를 눌러 뒤집기